package com.zeyu.soc.log.instrumentation;

import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;
import java.util.Set;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.NotFoundException;

import com.zeyu.soc.log.utils.JavassistUtils;

public class RestoreClassTransformer implements ClassFileTransformer {

	// ================================================================
	// Constants
	// ================================================================

	// ================================================================
	// Fields
	// ================================================================

	private Set<String> transformedClassSet;

	// ================================================================
	// Constructors
	// ================================================================

	public RestoreClassTransformer(Set<String> transformedClassSet) {
		super();
		this.transformedClassSet = transformedClassSet;
	}

	// ================================================================
	// Methods from/for super Interfaces or SuperClass
	// ================================================================

	@Override
	public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
			ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
		if (!transformedClassSet.contains(className.replace("/", "."))) {
			return null;
		}

		System.out.println("###restoring class " + className.replace("/", "."));
		try {
			JavassistUtils.addJavassistClassPath(classBeingRedefined);
			CtClass cc = ClassPool.getDefault().get(className.replace("/", "."));
			cc.defrost();
			cc.detach();
		} catch (NotFoundException e) {
			e.printStackTrace();
		} finally {
			JavassistUtils.cleanJavassistClassPath();
		}
		return classfileBuffer;
	}

	// ================================================================
	// Public or Protected Methods
	// ================================================================

	// ================================================================
	// Getter & Setter
	// ================================================================

	// ================================================================
	// Private Methods
	// ================================================================

	// ================================================================
	// Inner or Anonymous Class
	// ================================================================

	// ================================================================
	// Test Methods
	// ================================================================
}
